% (5-10) páginas
%
%   Objetivos geral e específicos
%   Resultados esperados
%   Limitações do trabalho
%   Métodos
%   Justificativa
%   Descrição dos demais capítulos

% In practice, there are two kinds of software dependencies:	Static, or "compile-time," dependencies and dynamic, or "run-time," dependencies.
% Static dependencies capture the notion that one software module is necessary in order to compile another. In other words, A depends on B just in case the source code of A makes an explicit reference to B. In such a case, in order to compile A to an executable form, it is necessary to have access to B.
% Run-time dependencies, in contrast, are based on actual calling patterns of the software during operation, and vary according its use and deployment. They cannot, in general, be inferred from any a priori examination of the software code. For this reason, this investigation focuses on analyzing static software dependencies.

\chapter{Introdução}

\begin{section}{Contexto}

		Para um sistema de software ser bem sucedido não basta ele ser rápido, funcional e isento de defeitos. Esses atributos dizem respeito à qualidade, da forma como é enxergada pelos seus usuários, de uma versão do sistema. Para atender a demandas emergentes de seus usuários e incorporar novidades tecnológicas, no entanto, um sistema de software deve apresentar certos atributos de qualidade interna, visíveis apenas para os seus desenvolvedores. Ele precisa ser fácil de compreender, fácil de modificar e fácil de testar \cite{Parnas1994}.

		Um bom indicador da qualidade interna de um sistema de software é a estrutura de dependências entre as entidades que compõem o seu código-fonte. Considera-se como dependência qualquer referência que uma entidade, em seu código-fonte, faça a outra entidade. É natural que existam interações entre diversas entidades em um sistema, mas dependências indesejadas adicionam complexidade ao software, tornando mais difíceis tarefas ligadas a sua manutenção, como compreender ou testar isoladamente as suas diversas partes \cite{Chidamber1994}. % CBO, página 11

		% Acho que aqui falta uma introdução a engenharia reversa.
		Analisar uma a uma as dependências de um sistema de software com a finalidade de extrair informações que apoiem a sua manutenção é, no entanto, uma tarefa árdua \cite{Tonella2007}. Em um sistema com $n$ entidades, existem cerca de $n^2$ potenciais dependências a se analisar. Em sistemas com mais do que algumas dezenas de entidades, a quantidade de dependências potenciais é da ordem de centenas ou milhares. %Ao tentar visualizar as dependências de um sistema grande através de diagramas de caixas e setas, as dependências acabam representadas como um emaranhado de setas. % Dunbar's number: 150
		
		Face à dificuldade de se analisar manualmente as dependências de um sistema, surgiram ferramentas de engenharia reversa voltadas para a inferência automática --- sem interferência humana --- de informações que apoiam tarefas específicas de manutenção. Existem, por exemplo, ferramentas que procuram identificar partes do sistema afetadas por uma mudança \cite{Arnold1993}, código duplicado \cite{Roy2007} ou módulos arquiteturais \cite{Maqbool2007}. 

		% Falar aqui sobre necessidade de avaliação empírica? Ou lá embaixo?
		% USO DE AVALIAÇÃO EMPÍRICA
		% Na concepção de ferramentas de engenharia está embutida a hipótese de que as informações identificadas pelas ferramentas são próximas às informações que um especialista identificaria. Para sustentar a hipótese, no entanto, é preciso acumular evidências empíricas que a corroborem.

	As tarefas que as ferramentas buscam automatizar, entretanto, envolvem alguma subjetividade. O conceito de módulo arquitetural, por exemplo, não é bem definido. Mesmo dois especialistas, ao analisar independentemente um sistema de software, dificilmente identificam o mesmo conjunto de módulos arquiteturais \cite{Koschke2000}. % e dependências não é suficiente: falta semântica!

	% DIFICULDADE EM AVALIAR AS FERRAMENTAS
	Dada a subjetividade das tarefas, a avaliação empírica de ferramentas de engenharia reversa usualmente requer a presença de programadores que tenham experiência nas tarefas que as ferramentas se propõem a cumprir, além de familiaridade com as ferramentas avaliadas. Tais requisitos elevam o custo envolvido na realização de experimentos. % de qualidade.
	 
	% , e por isso as ferramentas precisam ser avaliadas empiricamente. dar mais detalhes.
	
  % When conducting empirical studies in reverse engineering, the variability of the skill and experience of the involved individuals may be high. Thus, subjects must be distributed carefully across the groups defined in the experimental design. Other sources of variability lie in the software development tasks given to the subjects, as well as the software systems themselves. These factors need to be taken into account and possibly controlled during the execution of the study.
	
	% LIMITAÇÕES NOS ESTUDOS DE AVALIAÇÃO EMPÍRICA
	Como resultado, a frequência com que as avaliações empíricas são realizadas está aquém do que se espera de uma área de pesquisa madura. Um estudo realizado com artigos sobre engenharia reversa publicados de 2002 a 2005 revelou que 25\% dos artigos não apresentam qualquer forma de avaliação empírica e, dentre os demais artigos, apenas 30\% recorrem a experimentos e estudos observacionais --- os outros 70\% recorrem a métodos menos rigorosos, como estudos de caso e relatos de experiência \cite{Tonella2007}.

	% juntar com o recado do final do parágrafo anterior?
	% ESTE PARÁGRAFO FOI ANTECIPADO
		% A escassez de experimentos controlados em engenharia reversa pode ser explicada, em parte, pelo alto custo envolvido na realização de experimentos de qualidade. Em muitos casos, os experimentos envolvem um planejamento cuidadoso e dependem da disponibilidade de desenvolvedores experientes.

		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

		Uma abordagem empregada quando os experimentos controlados são caros é a simulação de modelos computacionais, por tratar-se de um meio para se realizar experimentos controlados a um custo baixo. Essa abordagem tem sido usada em diversas áreas, como física, economia, biologia, economia, engenharia, redes de computadores etc. Na área de redes e sistemas distribuídos, por exemplo, é frequente o uso de ambientes de simulação de redes, que modelam o funcionamento de uma rede de computadores, incluindo, às vezes, modelos de falhas de hardware e até modelos de comportamento de usuários \cite{White2002}. 
		
		Naturalmente, há o risco de os modelos usados na simulação não corresponderem à realidade nos aspectos relevantes para o experimento. Todavia, espera-se que esse risco seja reduzido à medida que os modelos são testados e refinados.

		Na engenharia de software, a abordagem de modelagem e simulação é pouco explorada. Durante esta pesquisa, foram encontrados alguns trabalhos que aplicam a simulação no estudo de processos de desenvolvimento de software \cite{Stopford2008}. Não foi encontrado, no entanto, nenhum trabalho na área de engenharia reversa com foco na modelagem computacional de dependências.
		
\end{section}

\begin{section}{Problema}
	
	A avaliação empírica tradicional de ferramentas de engenharia reversa baseadas na análise de dependências requer a colaboração de programadores experientes e, por isso, é custosa. O custo elevado é um problema porque contribui para que o número de pesquisas experimentais na área seja reduzido. 
	
  Abordagens experimentais com custo mais baixo poderiam contribuir para aumentar o volume de pesquisas experimentais em engenharia reversa. Como resultado, os efeitos positivos e negativos de cada ferramenta seriam melhor compreendidos, o que colaboraria para o aprimoramento das ferramentas existentes.
	
	% A abordagem de modelagem e simulação seria, devido a seu menor custo, uma alternativa viável para avaliar ferramentas de engenharia reversa que se baseiam na análise de dependências. O problema é que não existem modelos computacionais que comprovadamente representam de forma adequada as dependências entre entidades de sistemas de software. Se modelos computacionais apropriados existissem, seria possível realizar mais estudos experimentais sobre ferramentas de engenharia reversa, tendo como consequência uma maior compreensão das vantagens e fraquezas de cada ferramenta.
	
\end{section}

\begin{section}{Solução Proposta}
	% tópico: análise de dependências? engenharia reversa? avaliação empírica?
	% issue: avaliação empírica em engenharia reversa
	% research question: 
	
	% É viável usar a abordagem de modelagem de simulação para avaliar ferramentas de engenharia reversa que se baseiam na análise de dependências?
	
	% para o problema do alto custo envolvido na realização de experimentos com ferramentas de engenharia reversa
	A solução proposta nesta pesquisa para o problema do alto custo é usar modelos computacionais de dependências para avaliar ferramentas de engenharia reversa. Os modelos são algoritmos que recebem parâmetros e, como saída, geram grafos que representam dependências. Se protocolos de rede podem ser avaliados em experimentos simulados com modelos de redes de computadores, por que não avaliar ferramentas de engenharia reversa com base em dependências construídas a partir da simulação controlada de um modelo de dependências? A solução apresenta pelo menos duas vantagens em relação à abordagem tradicional de avaliação: 
	
	\begin{itemize}
		\item o custo é mais baixo;
		\item o controle das variáveis independentes é maior, uma vez que modelos computacionais possuem parâmetros que podem ser ajustados.
	\end{itemize}

	Dito isso, o foco desta pesquisa não é a avaliação de ferramentas de engenharia reversa --- embora uma avaliação do gênero seja apresentada como prova de conceito. O foco desta pesquisa é a avaliação de modelos computacionais que podem apoiar a avaliação de ferramentas de engenharia reversa. 
	
	Para simplificar as discussões, consideremos algumas definições. As dependências de um sistema de software são representados sob a forma de \emph{rede} (para efeitos práticos, o mesmo que \emph{grafo}). Assim, os modelos computacionais devem ser \emph{modelos de redes}. Chamaremos de \emph{rede de software} o conjunto de entidades e dependências entre entidades extraídos de um sistema de software. Redes que se assemelham a redes de software serão chamadas de redes \emph{software-realistas}.
	
	Com essas definições, a questão de pesquisa pode ser enunciada de forma sucinta: \emph{existem modelos de redes software-realistas?}
	
	% Naturalmente, um requisito da solução é que os modelos devem gerar redes software-realistas, isto é, redes que se assemelham a redes de software. 
	% Deixar claro, neste ponto, que nosso objetivo de pesquisa não é resolver imediatamente o problema do alto custo, e sim fornecer alternativas confiáveis.
	
\end{section}

% \begin{section}{Hipótese de Pesquisa}
% 	
% 	Algum modelo de dependências produz dependências que se assemelham a dependências extraídas de sistemas de software.
% 	
% \end{section}

% \begin{section}{Objetivos}
% 	O objetivo desta pesquisa é descobrir e avaliar modelos de dependências entre entidades do código-fonte de sistemas de software com a finalidade de apoiar o uso de simulações na avaliação de técnicas de engenharia reversa que se baseiam na análise de dependências.
% 	
% 	O objetivo se desdobra nos seguintes objetivos específicos:
% 	
% 	\begin{enumerate}
% 		\item descobrir modelos computacionais que podem ser interpretados como modelos de dependências entre entidades de código-fonte;
% 		\item avaliar os modelos de acordo com a similaridade entre a estrutura das dependências produzidas pelos modelos e a estrutura das dependências que são extraídas de sistemas de software reais;
% 		\item realizar uma prova de conceito para demonstrar a viabilidade da abordagem de simulação para a avaliação de técnicas e ferramentas que se baseiam na análise de dependências.
% 	\end{enumerate}
% 	
% \end{section}

% \begin{section}{Delimitação do Escopo}
% 	% ESCOPO DO TRABALHO
% 	% - modelos de redes organizadas em módulos
% 	% - paradigma orientado a objetos, linguagem Java
% 	% será que não ficou confuso apresentar o escopo sem antes apresentar redes complexas?
% 	Optamos por considerar apenas modelos que geram redes nas quais as entidades são organizadas em módulos, uma vez que o conceito de módulo é recorrente na idealização e na construção de sistemas de software. Além disso, modelos com módulos são mais gerais do que modelos sem módulos e, portanto, têm maior aplicabilidade.
% 	
% 	A fim de simplificar a pesquisa, optamos por comparar as dependências geradas pelos modelos com dependências extraídas de sistemas escritos em uma única linguagem de programação, a linguagem Java, que segue o paradigma de programação orientada a objetos. A simplificação se justifica pelo fato de que ferramentas de extração de dependências, em geral, funcionam apenas com uma ou com algumas poucas linguagens de programação. Aumentar o número de linguagens de programação, portanto, implicaria utilizar diversas ferramentas de extração, aumentando a complexidade do estudo. A linguagem Java foi escolhida por ser popular e por existir uma variedade de ferramentas de extração de dependências para a linguagem.
% 	
% 	Além disso, decidimos considerar apenas dependências estáticas, isto é, dependências que podem ser identificadas a partir da análise de uma representação estática (como o código-fonte) dos sistemas em Java. A razão para tal escolha é que a extração de dependências dinâmicas, identificadas durante a execução dos sistemas, apresenta maior custo.
% 
% \end{section}

\begin{section}{Métodos}
	
	A abordagem empregada nesta pesquisa pode ser desdobrada nos seguintes passos:
	
	% Assim sendo, os objetivos de pesquisa se desdobram nos seguintes itens:
	% 
	\begin{enumerate}
		\item descobrir modelos de redes, os quais podem ser interpretados como modelos de dependências entre entidades de código-fonte;
		\item desenvolver e avaliar um modelo de classificação que determina se uma rede é ou não software-realista;
		\item avaliar, através do modelo de classificação, se os modelos produzem redes software-realistas;
		\item realizar uma prova de conceito para demonstrar a viabilidade da simulação de modelos de redes na avaliação de técnicas e ferramentas que se baseiam na análise de dependências.
	\end{enumerate}
	
	Os métodos escolhidos para lidar com cada um dos passos são apresentados a seguir.
	
	% REDES COMPLEXAS
	A teoria das redes complexas estuda métodos para analisar redes (ou grafos) encontradas nos mais diversos domínios, como redes sociais, redes de computadores e redes metabólicas. A aplicação de tais métodos levou à descoberta de propriedades comuns a um grande número de redes, bem como modelos de redes que incorporam essas propriedades.
	
	Dado que as dependências em um sistema de software formam uma rede, optou-se por utilizar nesta pesquisa alguns dos métodos e descobertas da teoria das redes complexas. Em particular, decidiu-se investigar modelos computacionais de redes propostos na literatura sobre redes complexas.

	% AVALIAÇÃO
	Para determinar se uma rede é ou não software-realista, optou-se por uma abordagem baseada na disciplina de aprendizagem de máquina, na qual o conceito de software-realismo é induzido a partir de exemplos. Para auxiliar tal abordagem, decidiu-se investigar métricas estudadas na teoria de redes complexas para comparação de redes.
	
	% Essa abordagem foi aliada  aliada a métricas encontradas na teoria das redes complexas.
	% A avaliação dos modelos teve como base a simulação dos modelos e posterior comparação das redes geradas com redes extraídas de sistemas de software. Optou-se por investigar na literatura sobre redes complexas métricas para comparação de redes.
	%As redes produzidas pelos modelos foram comparadas com redes de dependências extraídas de sistemas de software escritos em Java. 
	
	% APLICAÇÃO
	Para a prova de conceito foi escolhido o problema de recuperação de arquitetura de software, devido à familiaridade do autor com o problema. Optou-se por aplicar algoritmos de agrupamento usados na atividade de recuperação de arquitetura a redes de dependências geradas por um dos modelos computacionais e então analisar os dados com ferramentas estatísticas.

\end{section}

\begin{section}{Resultados}
	
	% IDENTIFICAÇÃO DE 2 MODELOS; PROPOSTA DE UM NOVO MODELO.
	Foram encontrados na literatura diversos modelos de redes, os quais podem ser interpretados como modelos de dependências entre entidades de software. Além disso, um modelo de redes organizadas em módulos, o BCR+, foi desenvolvido no contexto desta pesquisa.
	
	% MODELO DE CLASSIFICAÇÃO
	Foi desenvolvido um modelo de classificação que, dada uma rede, a classifica em software-realista ou não-software realista. O modelo de classificação foi avaliado com um conjunto composto de redes de software e de outros domínios e apresentou taxa de acerto de cerca de 98\%.
	
	% REALISMO DOS MODELOS
	O modelo de classificação foi aplicado a redes geradas com diversos modelos de redes e, como resultado, constatou-se que o modelo BCR+ e outros dois produzem tanto redes software-realistas quanto redes não software-realistas. %Além disso, foram encontradas regras que preveem, com uma taxa de acerto de 75\%, se uma determinada combinação de valores dos parâmetros desses modelos produz redes software-realistas.
	
	% PROVA DE CONCEITO
	Como prova de conceito foram realizados, a partir da simulação do modelo BCR+, três experimentos com a finalidade de compreender e comparar algoritmos usados no contexto da atividade de recuperação de arquitetura. Os experimentos mostram que a abordagem de avaliação usando modelos é viável e complementa a abordagem tradicional.
	
	% ARTIGO PUBLICADO
	Como resultado concreto de pesquisa, foi publicado um artigo na 14ª Conferência Europeia sobre Manutenção de Software e Reengenharia (CSMR 2010). O artigo foi intitulado ``Modular Network Models for Class Dependencies in Software'' e apresentou a avaliação de três modelos de redes.

	% Como resultado, foram encontrados dois modelos de redes apropriados para representar dependências entre entidades, e um modelo que foi criado a partir da adaptação de um modelo existente. O novo modelo é apresentado em detalhes no Capítulo ....
	% 
	% A avaliação dos modelos foi realizada através da simulação dos modelos e posterior uso de métodos asd.sd..asd.... Linguagens OO apenas. A avaliação e os resultados são apresentados no Capítulo ....
	% 
	% Para a prova de conceito foi escolhido o problema de recuperação de arquitetura. A prova de conceito .. no Capítulo ....
	
\end{section}

\begin{section}{Estrutura do Documento}
	
	No Capítulo \ref{cap:redes} são apresentados métodos, modelos e descobertas da teoria das redes complexas. Uma métrica de similaridade entre redes é exposta. Os modelos ER, BA, CGW e LFR são descritos.
	
	No Capítulo \ref{cap:bcr} é detalhado o modelo BCR+, com descrição algorítmica e exemplos.
	
	No Capítulo \ref{cap:classificacao} é apresentado e avaliado um modelo de classificação que indica se uma dada rede é semelhante a redes de dependências extraídas de sistemas de software.
	
	No Capítulo \ref{cap:avaliacao} é relatada a avaliação dos modelos de redes quanto ao software-realismo das redes que eles geram.
	
	No Capítulo \ref{cap:estudo} é feita uma introdução ao problema de recuperação de arquitetura e, a seguir, são apresentados os métodos e resultados da prova de conceito envolvendo o problema de recuperação de arquitetura e o modelo BCR+.
	
	No Capítulo \ref{cap:trabrel} este trabalho é comparado a outros trabalhos.
	
	No Capítulo \ref{cap:conclusao} são apresentadas algumas conclusões, contribuições e limitações deste trabalho.
	
\end{section}
